package com.robertux.leaderboard.util.gestoresModelos;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.robertux.leaderboard.beans.RolUsuario;
import com.robertux.leaderboard.beans.entities.SucursalSupervision;
import com.robertux.leaderboard.beans.entities.Usuario;
import com.robertux.leaderboard.beans.entities.external.Sucursal;

public class GestorSucursales {
	private Map<Integer, Sucursal> sucursales;
	private JsonArray jsSucursales;
	private GestorEntidades<SucursalSupervision> gSucs;
	private Logger logger;
	
	public GestorSucursales() {
		this.logger = Logger.getLogger(this.getClass());
		this.jsSucursales = new JsonArray();
		this.cargarSucursales();
		this.gSucs = new GestorEntidades<SucursalSupervision>();
	}
	
	public void cargarSucursales() {
		this.sucursales = new HashMap<Integer, Sucursal>();
		for(Sucursal suc: new GestorEntidadesFarmacia().getSucursales()) {
			this.sucursales.put(suc.getId(), suc);
			
			JsonObject sucObj = new JsonObject();
    		sucObj.addProperty("id", suc.getId());
    		sucObj.addProperty("name", suc.getNombre());
    		sucObj.addProperty("selected", false);
    		this.jsSucursales.add(sucObj);
		}
	}
	
	public Collection<Sucursal> getSucursales() {
		return this.sucursales.values();
	}
	
	public JsonArray getJsSucursales() {
		return this.jsSucursales;
	}
	
	public Sucursal getSucursal(int idSucursal) {
		return this.sucursales.get(idSucursal);
	}

	public Collection<Sucursal> getSucursales(Usuario usr) {
		List<Sucursal> sucs = new ArrayList<Sucursal>();
		switch(RolUsuario.fromNivel(usr.getRol().getNivel())) {
		case SUPERVISOR:
			for(SucursalSupervision sucSup: usr.getSucursalesSupervision()) {
				sucs.add(this.getSucursal(sucSup.getSucursalId()));
			}
			break;
		default:
			sucs.add(this.getSucursal(usr.getSucursalId()));
			break;
		}
		return sucs;
	}
	
	public Usuario getSupervisorSucursal(Sucursal suc) {
		Usuario us = null;
		try {
			TypedQuery<SucursalSupervision> qry = this.gSucs.getEntityManager().createQuery("SELECT sucSup FROM SucursalSupervision sucSup WHERE sucSup.sucursalId = :sucId", SucursalSupervision.class);
			qry.setParameter("sucId", suc.getId());
			
			us = qry.getSingleResult().getUsuario();
		} catch (NoResultException nrE) {
			us = null;
		} catch (Exception e) {
			this.logger.error("No se pudo obtener el Supervisor de la Sucursal con ID " + suc.getId() + ": " + e.getMessage(), e);
			return null;
		}
		
		return us;
	}
}
